package sys_ctrl

import (
	"ubt-gin-admin/app/api/model/sys_mod"
	"ubt-gin-admin/app/api/service/sys_serv"
	"ubt-gin-admin/app/pkg/enums"
	"ubt-gin-admin/app/pkg/parse"
	"ubt-gin-admin/app/utils"

	"github.com/gin-gonic/gin"
)

type sysNote struct{}

var SysNoteCtrl sysNote

// Process 处理消息
func (c *sysNote) Process(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	req := &sys_mod.SysNoteProReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(ctx, req); err != "" {
		utils.ToJson(ctx, enums.ParamErr.Code, err, nil)
		return
	}
	// 过滤关键参数值中的非法字符
	req.SnuIds = utils.InputFilter(req.SnuIds, true)
	code, msg := sys_serv.SysNoteServ.Process(req)
	if code == enums.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: enums.SysNote, IpAddr: userInfo.ClientIp, Kind: req.States}
		sys_serv.SysLogServ.Add(logReq)
	}
	utils.ToJson(ctx, code, msg, nil)
}

// One 获取消息详情
func (c *sysNote) One(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	// 过滤关键参数值中的非法字符
	noteId := ctx.Query("noteId")
	noteId = utils.InputFilter(noteId, true)
	if noteId == "" || len(noteId) != 21 {
		utils.ToJson(ctx, enums.ParamErr.Code, enums.ParamErr.Msg, nil)
		return
	}
	code, msg, data := sys_serv.SysNoteServ.One(noteId)
	utils.ToJson(ctx, code, msg, data)
}

// Page 获取消息分页列表
func (c *sysNote) Page(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	keywords := ctx.Query("keywords")
	beginTimes := ctx.Query("beginTime")
	endTimes := ctx.Query("endTime")
	limits := ctx.Query("limit")
	offsets := ctx.Query("offset")
	keywords = utils.InputFilter(keywords, false)
	limits = utils.InputFilter(limits, true)
	offsets = utils.InputFilter(offsets, true)
	limit := parse.Str2u8(limits)
	offset := parse.Str2u32(offsets)
	beginTime := parse.Str2int(beginTimes)
	endTime := parse.Str2int(endTimes)
	// 先统计信息的数量
	req := &sys_mod.SysNotePageReq{UserId: userInfo.UserId, Keywords: keywords, BeginTime: beginTime, EndTime: endTime}
	code, msg, data := sys_serv.SysNoteServ.Count(req)
	if code == enums.Succeed.Code {
		res := &sys_mod.SysNotePageRes{Total: data}
		// 再查询具体的信息列表
		req.Limit = limit
		req.Offset = offset
		if code, data, data = sys_serv.SysNoteServ.Page(req); code == enums.Succeed.Code {
			res.List = data
			utils.ToJson(ctx, enums.Succeed.Code, enums.Succeed.Msg, res)
			return
		}
	}
	utils.ToJson(ctx, code, msg, nil)
}

// New 查询是否存在未读消息
func (c *sysNote) New(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	code, msg, data := sys_serv.SysNoteServ.New(userInfo.UserId)
	utils.ToJson(ctx, code, msg, data["nums"])
}

// Read 已读消息
func (c *sysNote) Read(ctx *gin.Context) {
	req := &sys_mod.SysNoteReadReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(ctx, req); err != "" {
		utils.ToJson(ctx, enums.ParamErr.Code, err, nil)
		return
	}
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	req.SnuId = utils.InputFilter(req.SnuId, true)
	if req.SnuId == "" || len(req.SnuId) != 21 {
		utils.ToJson(ctx, enums.ParamErr.Code, enums.ParamErr.Msg, nil)
		return
	}
	code, msg := sys_serv.SysNoteServ.Read(req.SnuId)
	if code == enums.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: enums.SysNote, IpAddr: userInfo.ClientIp, Kind: 7}
		sys_serv.SysLogServ.Add(logReq)
	}
	utils.ToJson(ctx, code, msg, nil)
}
